home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl5
- #
- # named-config.cgi
- #
- # Copyright 1988-1996 Silicon Graphics, Inc.
- # All rights reserved.
- #
- # This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- # the contents of this file may not be disclosed to third parties, copied or
- # duplicated in any form, in whole or in part, without the prior written
- # permission of Silicon Graphics, Inc.
- #
- # RESTRICTED RIGHTS LEGEND:
- # Use, duplication or disclosure by the Government is subject to restrictions
- # as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- # and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- # successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- # rights reserved under the Copyright Laws of the United States.
- #
- # $Id: named-config.frm,v 1.47 1997/06/19 22:25:09 shotes Exp $
-
- require "/usr/OnRamp/lib/OnRamp.pm";
- require "/usr/OnRamp/lib/java.pm";
-
- $conf = "/etc/named.boot";
- $dummy = "/etc/named.boot.dummy";
- $myname = "named-config.cgi";
- $title = "Domain Name Server";
-
- # note; this does not match AccountForm prototype
- # since it also requires the runOK() routine.
- # also, testDomain is unique in that it allows
- # IN-ADDR.ARPA domains...
- $js_main =
- "$js_error_box
- $js_hostname
- $js_iplist
- $js_ip
- which = \"none\";
- function runSubmit() {
- if(which == \"add\") return runAdd();
- if(which == \"edit\") return runEdit();
- if(which == \"delete\") return runDelete();
- if(which == \"ok\") return runOK();
- return (true);
- }
- function markAdd() { which = \"add\"; }
- function markEdit() { which = \"edit\"; }
- function markDelete() { which = \"delete\"; }
- function markOK() { which = \"ok\"; }
- function markOther() { which = \"none\"; }
- function runAdd() {
- form = document.DNSForm;
- if (!testDomain(form.newDomain)) return (false);
- return (true);
- }
- function runEdit() {
- Ctrl = document.DNSForm.chosen;
- none = true;
- for(i = 0; i < Ctrl.length; i++) { if (Ctrl.options[i].selected) { none = false; break; } }
- if(none) { errorBox (Ctrl, \"To edit an existing domain, first select a domain \\nfrom the list, then click the edit button.\"); return (false); }
- return (true);
- }
- function runDelete() {
- Ctrl = document.DNSForm.chosen;
- none = true;
- for(j = 0; j < Ctrl.length; j++) { if (Ctrl.options[j].selected) { none = false; break; } }
- if(none) { errorBox (Ctrl, \"To delete an existing domain, first select a domain \\nfrom the list, then click the delete button.\"); return (false); }
- return (true);
- }
- function runOK() {
- form = document.DNSForm;
- if (!testIPList(form.forwarders, \"forwarder\")) return (false);
- return (true);
- }
-
- function createArray(num) {
- this.length = num;
- for (var j = 0; j < num; j++) { this[j] = 0; }
- }
-
- function testDomain(Ctrl) {
- nums = \"0123456789\";
- arpa_num = 0; i = 0;
- st_num = false;
-
- p_places = new createArray(4);
-
- if (Ctrl.value == \"\") {
- errorBox (Ctrl, \"To add a new domain, first enter \\nthe domain name.\");
- return (false);
- }
-
- for(i=0; i<nums.length; i++)
- if (Ctrl.value.charAt(0) == nums.charAt(i)) st_num = true;
-
- if (st_num) {
- arpa_num = 0;
- for(i=0; i<Ctrl.value.length; i++)
- if (Ctrl.value.charAt(i) == \"I\" || Ctrl.value.charAt(i) == \"i\") arpa_num = i;
- if (arpa_num == 0) {
- errorBox (Ctrl, \"The domain name \" + Ctrl.value + \"\\nis invalid.\");
- return (false);
- }
- rev_ip = Ctrl.value.substring(0, arpa_num - 1);
- arpa_str = Ctrl.value.substring(arpa_num, Ctrl.value.length);
-
- arpa_str = arpa_str.toUpperCase();
- if (arpa_str != \"IN-ADDR.ARPA\") {
- errorBox (Ctrl, \"The domain name \" + Ctrl.value + \"\\nis invalid.\");
- return (false);
- }
-
- p_places[0] = -1;
- num_periods = 0;
- for (i=0; i<rev_ip.length; i++) {
- if (rev_ip.charAt(i) == \".\") {
- num_periods++;
- p_places[num_periods] = i;
- }
- }
-
- unrev_ip = rev_ip.substring(p_places[num_periods] + 1, rev_ip.length);
- for (i=num_periods; i>=1; i--)
- unrev_ip = unrev_ip + \".\" + rev_ip.substring(p_places[i-1]+1,p_places[i]);
-
- if (!testIPaddress(unrev_ip, false)) {
- errorBox(Ctrl, \"The domain name \" + Ctrl.value + \"\\nis invalid.\");
- return (false);
- }
-
- } else {
- if (!testHostname(Ctrl, Ctrl.value, \"domain name\", 0))
- return (false);
- }
- return (true);
- }";
-
- $js_add =
- "$js_standard
- $js_error_box
- $js_filename
- $js_ip
- $js_iplist
- function checkForm(form) {
- if (!testFilename(form.newFile, \"file name\")) return (false);
- if (form.list.value == \"\" && form.newType.options[1].selected) {
- errorBox (form.list, \"A list of server addresses is \"
- + \"required \\nfor the secondary domain.\");
- return (false);
- }
- if (!testIPList(form.list, \"server address\")) return (false);
- return (true);
- }";
-
- $js_edit =
- "$js_standard
- $js_error_box
- $js_filename
- $js_ip
- $js_iplist
- function checkForm(form) {
- if (!testFilename(form.newFile, \"file name\")) return (false);
- if (form.list.value == \"\" && form.type.options[1].selected) {
- errorBox (form.list, \"A list of server addresses is \"
- + \"required \\nfor the secondary domain.\");
- return (false);
- }
- if (!testIPList(form.list, \"server address\")) return (false);
- return (true);
- }";
-
-
- print "Content-type: text/html\n\n";
-
- &get_fields;
-
- $srv_on = get_config("named");
-
- $edit = 0;
- $delete = 0;
-
- &getDomains;
-
- if (%fld) {
- $fld{'chosen'} =~ /([\w.-]+)/;
- $fld{'chosen'} = $1;
-
- $help = $document_root . $ENV{"SCRIPT_NAME"};
- $help =~ s/cgi$/hlp/;
- exec $help if ($fld{'help'} eq "Help");
-
- if ($fld{'doit'} eq 'Ok') {
- if ($srv_on ne $fld{'server'}) { &changeStatus; }
- if ($fld{'delFile'}) { &delete($fld{'delFile'}); }
- &checkForwarders;
- &checkSlave;
- if (!$message) {
- if (!$fld{'newDomain'}) { $message = "No changes made."; }
- else { $message = qq|To add a new domain, click the "Add New Domain"
- button.|; }
- }
- }
- elsif ($fld{'add'}) {
- &formValid_add;
- $val{'domain'} = $fld{'newDomain'};
- $val{'type'} = $type;
- &getAdd;
- }
- elsif ($fld{'delete'}) {
- &error(0,"No domain selected.") if !$fld{'chosen'};
- $message = qq|Click "Ok" to save changes.|;
- $delete = 1;
- }
- elsif ($fld{'doAdd'} eq 'Ok') { &formValid_doAdd; &addDomain; &getDomains; }
- elsif ($fld{'doEdit'} eq 'Ok') { &formValid_doEdit; &editDomain; &getDomains; }
- elsif ($fld{'edit'}) {
- &error(0,"No domain selected.") if !$fld{'chosen'};
- &getDomains($fld{'chosen'});
- &putEdit;
- &getEdit;
- $edit = 1;
- }
- else { $message = "Use buttons to submit form."; &generic; exit 0; }
- }
-
- if (($fld{'add'} ne 'Add New Domain') && ($edit == 0)) {
- if (-e "/usr/sbin/named") { &generic; }
- else {
- &title_block($title);
- &header_block($title);
- print "<i>The domain name server software is not installed on this
- machine. Install subsystem </i><b>eoe.sw.named</b><i>
- from the distribution CD.</i>";
- }
- }
-
- sub checkSlave {
- if ($val{'slave'} ne $fld{'slave'}) {
- if ($fld{'slave'} eq 'Yes') {
- open(OUT,">> $conf");
- print OUT "slave\n";
- close(OUT);
- $val{'slave'} = 'Yes';
- $message = "Dynamic creation of direct links disabled.";
- } else {
- open(IN,"< $conf");
- open(OUT,"> $dummy");
- while(<IN>) {
- @items = split(/\s+/);
- if ($items[0] ne 'slave') { print OUT $_; }
- }
- close(IN);
- close(OUT);
- rename($dummy,$conf);
- $val{'slave'} = 'No';
- $message = "Dynamic creation of direct links enabled.";
- }
- }
- }
-
- sub changeStatus {
- if($fld{'server'} eq 'Yes') {
- system("/etc/chkconfig", "named", "on");
- system("/usr/sbin/named.restart");
- $srv_on = "Yes";
- $message = "Name server enabled.";
- }
- else {
- system("/etc/chkconfig", "named", "off");
- system("/etc/killall", "named");
- $srv_on = "No";
- $message = "Name server disabled.";
- }
- }
-
- sub formValid_add {
- &error(0,"Cannot add duplicate domain name.")
- if grep($_ eq $fld{'newDomain'},@domainList);
- &error(0,"Invalid domain name.")
- if $fld{'newDomain'} =~ /^\s+$/;
- # if (! ( $fld{'newDomain'} =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)\.in-addr\.arpa/ )) {
- # &error(0,"Invalid domain name.") if &check_hostname($fld{'newDomain'});
- # } else {
- # $reverse = "$4.$3.$2.$1";
- # &error(0,"Invalid IP address: $reverse.") if &check_ipaddr($reverse);
- # }
- }
-
- sub formValid_doAdd {
- my $erval = &check_fname($fld{'newFile'});
- &error(1,$erval) if $erval;
-
- if ($fld{'newType'} eq 'secondary') {
- &error(1,"Server addresses required for secondary domain.")
- if !$fld{'list'};
- @list = split(/[\n\s]+/,$fld{'list'});
- foreach $arg (@list) {
- &error(1,"Invalid IP address: $arg.") if &check_ipaddr($arg);
- }
- }
- }
-
- sub formValid_doEdit {
- my $erval = &check_fname($fld{'newFile'});
- &error(2,$erval) if $erval;
-
- if ($fld{'type'} eq 'secondary') {
- &error(2,"Server addresses required for secondary domain.")
- if !$fld{'list'};
- @list = split(/[\n\s]+/,$fld{'list'});
- foreach $arg (@list) {
- &error(2,"Invalid IP address: $arg.") if &check_ipaddr($arg);
- }
- }
- }
-
- sub error {
- $mes = $_[1];
- $send = $_[0];
- &error_block($mes);
- %val = %fld;
- if ($send == 0) { &generic; }
- elsif ($send == 1) { &getAdd; }
- elsif ($send == 2) { &getEdit; }
- exit 0;
- }
-
- sub editDomain {
- open(IN,"< $conf");
- open(OUT,"> $dummy");
-
- while(<IN>) {
- $line = $_;
- @items = split(/\s+/,$line);
- if ($items[1] ne $fld{'chosen'}) { print OUT $line; next; }
- else {
- print OUT "# $line";
- }
- }
-
- $numTab1 = 2 - length($fld{'type'})/8;
- $numTab2 = 4 - length($fld{'domain'})/8;
-
- print OUT $fld{'type'};
-
- for ($i=0;$i<$numTab1;$i++) { print OUT "\t"; }
- print OUT $fld{'chosen'};
- if ($fld{'type'} eq 'primary') {
- for ($i=0;$i<$numTab2;$i++) { print OUT "\t"; }
- } else {
- print OUT " ";
- foreach $arg (@list) {
- print OUT "$arg ";
- }
- }
- print OUT "$fld{'newFile'}\n";
-
- close(IN);
- close(OUT);
- rename($dummy, $conf);
- $message = "Domain edited.";
- }
-
- sub putEdit {
- $val{'newFile'} = $file;
- $val{'list'} = "";
- foreach $arg (@listServe) {
- $val{'list'} .= "$arg\n";
- }
- }
-
- sub getEdit {
- $num = $_[0];
-
- &js_title_block($title,$js_edit);
- &header_block("Edit Domain");
-
- print "<form name=StandardForm action=$myname method=post onSubmit=\"return runSubmit()\">";
- print "<center><table>";
-
- print "<input type=hidden name=chosen value=$fld{'chosen'}>";
- print "<input type=hidden name=type value=$val{'type'}>";
-
- print "<tr><th align=left>Domain name:</th><td><tt>$fld{'chosen'}</tt></td></tr>";
- print "<tr><th align=left>Name server type:</th><td><tt>$val{'type'}</tt></td></tr>";
-
- print "<tr><th align=left>File name for domain information:</th><td>";
- print &text("newFile",$val{'newFile'},21);
- print "</td></tr>\n";
-
- if ($fld{'type'.$num} ne 'primary') {
- print "<tr><th align=left valign=top>List of server addresses:</th>";
- print "<td><textarea name=list rows=5 cols=20>";
- print $val{'list'};
- print "</textarea></td>";
- print "</tr>\n";
- }
- print "</table></center><br>";
-
- print "<i> Note: server address list required only for secondary domains.</i><br><br>";
-
- print &js_buttons('doEdit','Ok','onClick="markOK()"','onClick="markOther()"');
-
- print "</form>";
- }
-
- sub delete {
- $num = $_[0];
-
- open(IN,"< $conf");
- open(OUT,"> $dummy");
-
- while(<IN>) {
- @items = split(/\s+/);
- if ($items[1] eq $_[0]) { print OUT "# $_"; }
- else { print OUT $_; }
- }
- close(IN);
- close(OUT);
- rename($dummy, $conf);
- $message = "Domain deleted.";
- }
-
- sub addDomain {
- $numTab1 = 2 - length($fld{'newType'})/8;
- $numTab2 = 4 - length($fld{'domain'})/8;
-
- open(OUT,">> $conf");
- print OUT $fld{'newType'};
- for ($i=0;$i<$numTab1;$i++) { print OUT "\t"; }
- print OUT $fld{'domain'};
- if ($fld{'newType'} eq 'primary') {
- for ($i=0;$i<$numTab2;$i++) { print OUT "\t"; }
- } else {
- print OUT " ";
- foreach $arg (@list) {
- print OUT "$arg ";
- }
- }
- print OUT "$fld{'newFile'}\n";
-
- close(OUT);
- $message = "$fld{'domain'} domain added.";
- }
-
- sub turnOn {
- system("/etc/chkconfig", "named", "on");
- $srv_on = 'Yes';
- $message = "Named enabled";
- }
- sub turnOff {
- system("/etc/chkconfig", "named", "off");
- $srv_on = 'No';
- $message = "Named disabled";
- }
-
- sub getDomains {
- $getDomain = $_[0];
- undef @domainList;
- undef @listServe;
- undef @forwarders, $forwarders;
- $val{'slave'} = "No";
-
- open(IN,"< $conf");
-
- $i = 0;
- while(<IN>) {
- $line = $_;
- @items = split(/\s+/,$line);
- $domain = $items[1];
-
- if ($items[0] eq 'slave') { $val{'slave'} = "Yes"; }
- elsif ($items[0] eq 'forwarders') {
- for ($i=1;$i<=$#items;$i++) {
- push(@forwarders,$items[$i]);
- }
- } elsif ($items[0] eq 'primary' || $items[0] eq 'secondary') {
- push(@domainList,$domain);
- if ($getDomain eq $domain) {
- $val{'type'} = $items[0];
- $file = $items[$#items];
- if ($val{'type'} eq 'secondary') {
- for ($i=2;$i<$#items;$i++) { push(@listServe,$items[$i]); }
- }
- }
- } else { next; } # cache not supported yet
- }
- close(IN);
- $val{'forwarders'} = join("\n",@forwarders);
- }
-
- sub checkForwarders {
- &getDomains;
- @list = split(/[\n\s]+/,$fld{'forwarders'});
- $newForwarders = join("\n",@list);
- if ($newForwarders ne $val{'forwarders'}) {
- open(IN,"< $conf");
- open(OUT,"> $dummy");
- while(<IN>) {
- @items = split(/\s+/);
- if ($items[0] ne 'forwarders') { print OUT $_; }
- else { print OUT "# $_"; }
- }
- if (@list) {
- print OUT "forwarders\t@list\n";
- }
- close(IN);
- close(OUT);
- rename($dummy, $conf);
-
- $val{'forwarders'} = join("\n",@list);
-
- $message = "List of other servers that can resolve names edited.";
- }
- }
-
- sub getAdd {
- &js_title_block($title,$js_add);
- &header_block("Add New Domain");
-
- if (!$val{'newFile'}) {
- $val{'newFile'} = "/etc/named.d/db.".$val{'domain'};
- }
-
- print "<form name=StandardForm action=$myname method=post onSubmit=\"return runSubmit()\">";
- print "<center><table>";
-
- print qq|<input type=hidden name="domain" value=$val{'domain'}>|;
-
- print "<tr><th align=left>Domain name:</th><td><tt>$val{'domain'}</tt></td></tr>";
- print "<tr><th align=left>Name server type:</th><td><tt>",
- &select('newType',$val{'newType'},'primary','secondary'), "</tt></td></tr>";
-
- print "<tr><th align=left>File name for domain information:</th>";
- print "<td>", &text("newFile",$val{'newFile'},21), "</td>";
- print "</tr>\n";
-
- print "<tr><th align=left valign=top>List of server addresses:</th>";
- print "<td><textarea name=list rows=5 cols=20>",
- $val{'list'},"</textarea></td>";
- print "</tr>\n";
-
- print "</table></center><br>";
-
- print "<i> Note: server address list required only for secondary domains.</i><br><br>";
-
- print &js_buttons('doAdd','Ok','onClick="markOK()"','onClick="markOther()"');
-
- print "</form>";
- }
-
- sub generic {
- &js_title_block($title,$js_main);
- &header_block($title);
-
- $val{'newDomain'} = $fld{'newDomain'};
-
- print "<i>$message</i>\n";
-
- print "<form name=DNSForm action=$myname method=post onSubmit=\"return runSubmit()\">\n";
-
- if ($delete) { print "<input type=hidden name=delFile value=$fld{'chosen'}>\n"; }
-
- print "<center><table width=450>";
- print "<tr><th align=left>Enable DNS server:</th><th align=left>\n";
- print &radio('server',$srv_on,'Yes','No');
- print "<br><br></th></tr>\n";
-
- print qq|<tr><th align=left><input type=submit name="add"
- value="Add New Domain" onClick="markAdd()"></th>\n|;
- print qq|<td>|,&text("newDomain",$val{'newDomain'},19),qq|</td></tr>\n|;
-
- if ($delete) {
- undef @locList;
- foreach $arg (@domainList) {
- if ($fld{'chosen'} ne $arg) { push(@locList,$arg); }
- }
- } else { @locList = @domainList; }
-
- print qq|<tr><th align=left><input type=submit name="edit"
- value="Edit Selected Domain" onClick="markEdit()"></th>\n|;
- print qq|<td rowspan=2>|, &choice_list(*locList,"chosen",20), qq|</td></tr>\n|;
-
- print qq|<tr><th align=left><input type=submit name="delete"
- value="Delete Selected Domain" onClick="markDelete()"></th></tr>\n|;
-
- print "<tr><td> </td></tr>\n";
-
- print "<tr><th align=left valign=top>Other servers to contact if <br>
- name cannot be resolved:</th><td>\n";
-
- print "<textarea name=forwarders rows=6 cols=18>$val{'forwarders'}</textarea></td></tr>\n";
-
- print "<tr><th align=left>Limit contact hosts to above:</th><th align=left>\n";
- print &radio('slave',$val{'slave'},'Yes','No');
- print "</th></tr>";
-
- print "</table></center><br>\n";
-
- print &js_buttons('doit','Ok','onClick="markOK()"','onClick="markOther()"');
-
- print "</form></body></html>";
- }
-
-